﻿using System;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Linq;
using Storytelling.Modelos;
using Storytelling.Models;
using Storytelling.Negocio.Rolador;
using Storytelling.Negocio;
using Storytelling.Utils;
using Storytelling.Entidades;
using System.Collections.Generic;

namespace Storytelling.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Mostrar = User.Identity.IsAuthenticated;

            if (User.Identity.IsAuthenticated)
            {
                ViewBag.IsNarrador = GerenciadorAcesso.UsuarioCorrentePertence(Tipo.Narrador);
            }
            else
	        {
                ViewBag.IsNarrador = false;
	        }

            Session["Atualizacao"] = 0;

            return View();
        }

        public ActionResult Chat()
        {
            long? atualizacao = Session["Atualizacao"] as long?;
            Queue<KeyValuePair<long, Notificacao>> queue = HttpContext.Application["Chat"] as Queue<KeyValuePair<long, Notificacao>>;

            var query = from noti in queue
                        where noti.Key >= (atualizacao.HasValue ? atualizacao.Value : 0)
                        orderby noti.Key ascending
                        select noti.Value;

            if (query.Count() > 0)
            {
                Session["Atualizacao"] = (long?)DateTime.Now.Ticks; 
            }

            return Json(query.ToList());
        }

        [HttpPost]
        [Authorize]
        public void Jogar(int? dados, int? explosao)
        {
            if (dados.HasValue && explosao.HasValue)
            {
                Explosao exp = Explosao.Nenhum;
                bool anulador = false;

                if (explosao.Value >= 8)
                {
                    exp = (Explosao)explosao.Value;
                }
                else
                {
                    anulador = true;
                }

                DateTime tempo = DateTime.Now;

                ParadaDados paradaDados = new ParadaDados(dados.Value, false, anulador, Dificuldade.Oito, exp);

                Usuario usuario = Session["Usuario"] as Usuario;

                JogadaNotificacao jogadaNotificacao = new JogadaNotificacao();
                jogadaNotificacao.NomeUsuario = usuario != null ? usuario.Nome : "";
                jogadaNotificacao.Ocorrido = string.Format("{0:hh:mm:ss.ff}", tempo);
                jogadaNotificacao.Sucessos = paradaDados.Sucessos;
                jogadaNotificacao.Dados = dados.Value;
                jogadaNotificacao.Explosao = explosao.Value;
                jogadaNotificacao.Anulador = explosao.Value == 0;
                jogadaNotificacao.Resultado = paradaDados.ToString();

                (HttpContext.Application["Chat"] as Queue<KeyValuePair<long, Notificacao>>).Enqueue(
                    new KeyValuePair<long, Notificacao>(tempo.Ticks, jogadaNotificacao));
            }
        }


        [HttpPost]
        [Authorize]
        public void JogarAcoes(JogadaAcaoViewModel jogadaAcaoViewModel)
        {
            if (jogadaAcaoViewModel.MeuPersonagemValor > 0 && jogadaAcaoViewModel.AcaoValor.HasValue)
            {
                int totalParada = 0;

                if (Servicos.Acao.ParadaDados(jogadaAcaoViewModel.MeuPersonagemValor,
                     jogadaAcaoViewModel.AcaoValor.Value, jogadaAcaoViewModel.MeuEquipamentoValor, out totalParada))
                {

                    

                    Explosao exp = Explosao.Nenhum;
                    bool anulador = false;

                    if (jogadaAcaoViewModel.Explosao.Value >= 8)
                    {
                        exp = (Explosao)jogadaAcaoViewModel.Explosao.Value;
                    }
                    else
                    {
                        anulador = true;
                    }

                    DateTime tempo = DateTime.Now;

                    Usuario usuario = Session["Usuario"] as Usuario;

                    AcaoNotificacao acaoNotificacao = new AcaoNotificacao();
                    acaoNotificacao.NomeUsuario = usuario != null ? usuario.Nome : "";
                    acaoNotificacao.Ocorrido = string.Format("{0:hh:mm:ss.ff}", tempo);

                    acaoNotificacao.Personagem = jogadaAcaoViewModel.MeuPersonagem;
                    acaoNotificacao.Acao = jogadaAcaoViewModel.Acao;
                    acaoNotificacao.Equipamento = jogadaAcaoViewModel.MeuEquipamento;

                    if (jogadaAcaoViewModel.Modificador.HasValue && jogadaAcaoViewModel.Modificador.Value > 0) 
                    {
                        acaoNotificacao.SinalModificador = jogadaAcaoViewModel.SinalModificador;
                        acaoNotificacao.Modificador = jogadaAcaoViewModel.Modificador.Value;

                        totalParada += (jogadaAcaoViewModel.SinalModificador ? jogadaAcaoViewModel.Modificador.Value : -(jogadaAcaoViewModel.Modificador.Value));
                    }

                    ParadaDados paradaDados = new ParadaDados(totalParada, false, anulador, Dificuldade.Oito, exp);

                    acaoNotificacao.Sucessos = paradaDados.Sucessos;
                    acaoNotificacao.Dados = totalParada;
                    acaoNotificacao.Explosao = jogadaAcaoViewModel.Explosao.Value;
                    acaoNotificacao.Anulador = jogadaAcaoViewModel.Explosao.Value == 0;
                    acaoNotificacao.Resultado = paradaDados.ToString();

                    (HttpContext.Application["Chat"] as Queue<KeyValuePair<long, Notificacao>>).Enqueue(
                        new KeyValuePair<long, Notificacao>(tempo.Ticks, acaoNotificacao)); 
                }
            }
        }

        [HttpPost]
        [AutorizarNarrador]
        public void GerenciarStatus(StatusModel model)
        {
            var colecao = Servicos.Humano.GerenciarStatus(model);

            if (colecao.Count > 0)
            {
                DateTime tempo = DateTime.Now;

                Usuario usuario = Session["Usuario"] as Usuario;

                StatusNotificacao statusNotificacao = new StatusNotificacao();
                statusNotificacao.NomeUsuario = usuario != null ? usuario.Nome : "";
                statusNotificacao.Ocorrido = string.Format("{0:hh:mm:ss.ff}", tempo);
                statusNotificacao.Colecao = colecao;

                (HttpContext.Application["Chat"] as Queue<KeyValuePair<long, Notificacao>>).Enqueue(
                    new KeyValuePair<long, Notificacao>(tempo.Ticks, statusNotificacao));
            }
        }
    }
}
